有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java找出哪个包调用服务

在equinox OSGi中,我使用的是来自几个不同捆绑包的服务(DS),我想知道每次谁在使用它

服务写入数据库,我想知道哪个包写入什么

BuildinLogService必须能够做到这一点,因为它知道每个日志行是谁写的,但我不知道如何写的

最简单的解决方案是将每个方法中的包的名称放入服务中,但我希望有一个更优雅的解决方案


共 (2) 个答案

  1. # 1 楼答案

    将捆绑包名称或Bundle对象添加到从服务客户端传递给服务的对象。通过这样做,您可以找到每个服务调用的客户机

    你提到了后勤服务。它使用LogEntry class将带有日志消息的Bundle对象传递给服务

  2. # 2 楼答案

    这正是ServiceFactory的用途,请参见OSGi核心R6规范第5.9节。“服务工厂”

    在澄清问题后更新如下,以指定DS用途

    这可以通过在@Component注释上使用scope=ServiceScope.BUNDLE来实现。然后,您可以通过允许将ComponentContext注入激活方法并调用getUsingBundle()来访问调用包。例如:

    @Component(scope = ServiceScope.BUNDLE)
    public class MyComponent implements MyService {
    
        private Bundle usingBundle;
    
        @Activate
        void activate(ComponentContext context) {
            this.usingBundle = context.getUsingBundle();
        }
    
        // ... 
    }
    

    在底层,这是通过将服务注册为ServiceFactory的实例而不是普通的服务对象来实现的。当OSGi代表使用者获得服务时,它调用getService方法,该方法将使用者绑定对象传递给服务的提供者。这对消费者来说是完全透明的,也就是说,他们根本不需要更改代码